package com.lazily.houserent.service;


import com.lazily.houserent.domain.House;

/**
 * @Author:  GZQ
 * @date:  2025/1/5 14:37
 * @description:
 * HouseService.java ==> 类 [业务层]
 * 定义House[], 用于保存House对象
 * 1. 响应HouseView的调用
 * 2. 完成对房屋信息的各种操作(增删改查c[create]r[read]u[update]d[delete])
 */

public class HouseService {
    // 定义数组，用于保存House对象
    private House[] houses;
    // 记录当前有多少个房屋信息
    private int houseNums = 1;
    // 记录当前的id增长到那个值
    private int idCounter = 1;

    /**
     * 构造器
     * @param size
     */
    public HouseService(int size) {
        // new houses
        /*
        * 当创建HouseService对象时，指定数组大小
        * */
        houses = new House[size];
        // 为了测试列表信息, 这里初始化一个House对象
        houses[0] = new House(1, "jack", "13000000000", "北京", 300, "未出租");
    }

    /**
     * list 方法, 返回houses信息
     * @return houses
     */
    public House[] list() {
        return houses;
    }

    /**
     * add 方法, 添加新对象
     * @param newHouse
     * @return boolean
     */
    public boolean add(House newHouse) {
        // 加入数组扩容机制 ==> 使用扩容机制的写法
//        House newHouses[] = new House[houses.length + 1];
//        for (int i = 0; i < houses.length; i++) {
//            newHouses[i] = houses[i];
//        }
//        houses = newHouses;
//        houses[houseNums++] = newHouse;
//        newHouse.setId(++idCounter);
//        return true;


        // 判断是否还可以继续添加(暂时不考虑数组扩容的问题) ==> 能否加入数组扩容机制
        if (houseNums == houses.length) {  // 不能再添加
            System.out.println("数组已满，不能再添加了");
            return false;
        }
        // 把newHouse对象，添加到数组中, 新增加了一个房屋
        houses[houseNums++] = newHouse;
        // 需要设计一个id自增的机制, 然后更新newHouse的id
        newHouse.setId(++idCounter);
        return true;
    }

    /**
     * del 方法, 根据id删除房屋信息
     * @param delId
     * @return boolean
     */
    public boolean del(int delId) {

        // 应当先找到删除的房屋信息对应的下标
        // 需要注意, 下标和房屋的编号不是一回事
        int index = -1;
        for (int i = 0; i < houseNums; i++) {
            if (delId == houses[i].getId()) { // 要删除的房屋(id), 在数组下标为i的元素
                index = i; // 就使用index记录i
                break;
            }
        }
        if (index == -1) { // 说明delId在数组中不存在
            return false;
        }
        // 如果找到,难点：删除数组中下标为index的元素
        // 思路分析：
        for (int i = index; i < houseNums - 1; i++) {
            houses[i] = houses[i + 1];
        }
        // 把当前存在的房屋信息的最后一个 设置为null
        houses[--houseNums] = null;
        return true;
    }

    /**
     * findById 方法, 根据id查询房屋信息
     * @param findId
     * @return House 或者 null
     */
    public House findById(int findId) {

        // 遍历数组 houses[], 找到id和findId相等的, 返回house[i]
        for (int i = 0; i < houseNums; i++) {
            if (findId == houses[i].getId()) {
                return houses[i];
            }
        }
        // 如果循环结束,没有找到, 返回null
        return null;
    }

    /**
     * findByAddress 方法, 根据地址查询房屋信息
     * @param findAddress
     * @return House 或者 null
     */
    public House findByAddress(String findAddress) {  // 有bug 如果有多个相同的地址，只能显示一个 ==> 待完善
        // 遍历数组 houses[], 找到address和findAddress相等的, 返回house[i]
        for (int i = 0; i < houseNums; i++) {
            if (findAddress.equals(houses[i].getAddress())) {
                return houses[i];
            }
        }
        // 如果循环结束,没有找到, 返回null
        return null;
    }
}
